﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Vector3 = DDD.Vector3<float>;

namespace DDD {

    /// <summary>
    /// レイと物体の交差情報
    /// </summary>
    /// <remarks>
    /// "Node.Pick(Ray)"でピッキング処理の結果として返される構造体です。
    /// レイとノードとの交差判定の結果を保存します。
    /// </remarks>
    public struct RayIntersection {
 

        #region Constructor
        /// <summary>
        /// コンストラクター
        /// </summary>
        /// <remarks>
        /// 超絶長えええええぇぇ。
        /// でも引数にVector3などは使わないのがDDDの思想なのでしょうがない
        /// </remarks>
        /// <param name="hit">ヒット判定の結果</param>
        /// <param name="d">レイの始点からヒット地点までの距離</param>
        /// <param name="node">ヒットしたノード</param>
        /// <param name="x">ヒットした地点の座標のX成分</param>
        /// <param name="y">ヒットした地点の座標のX成分</param>
        /// <param name="z">ヒットした地点の座標のX成分</param>
        /// <param name="nx">ヒットした地点の法線のX成分</param>
        /// <param name="ny">ヒットした地点の法線のX成分</param>
        /// <param name="nz">ヒットした地点の法線のX成分</param>
        /// <param name="ox">レイの始点のX成分</param>
        /// <param name="oy">レイの始点のY成分</param>
        /// <param name="oz">レイの始点のZ成分</param>
        /// <param name="dx">レイの方向のX成分</param>
        /// <param name="dy">レイの方向のY成分</param>
        /// <param name="dz">レイの方向のZ成分</param>
        public RayIntersection (bool hit, float d, Node node,
            float x, float y, float z, float nx, float ny, float nz, 
            float ox, float oy, float oz, float dx, float dy, float dz) 
            : this() {
            // 長すぎるな・・・
        }
        #endregion

        #region Property
        /// <summary>
        /// レイのヒット判定
        /// </summary>
        public bool Hit { get; private set; }

        /// <summary>
        /// ヒットしたノード
        /// </summary>
        public Node Node { get; private set; }

        /// <summary>
        /// 判定に使われたレイ
        /// </summary>
        public Ray Ray { get; private set; }

        /// <summary>
        /// ヒット地点までの距離
        /// </summary>
        public float Distance { get; private set; }

        /// <summary>
        /// ヒットした地点の座標位置
        /// </summary>
        public Vector3 Position { get; private set; }

        /// <summary>
        /// ヒットした地点の法線
        /// </summary>
        public Vector3 Normal { get; private set; }
        #endregion

        #region Method
        /// <summary>
        /// 現在のオブジェクトの状態を表す文字列を返します。
        /// </summary>
        /// <returns>現在のオブジェクトを説明する文字列</returns>
        public override string ToString () {
            return string.Format("RayIntersection: {0}, {1}, {2}, {3}, {4}, {5}", Hit, Distance, Node, Ray, Normal);
        }
        #endregion

    }
}
